package com.milo.coding.jmm;


/**
 * @Author milo
 * @Date 2021-01-19 22:00:11
 * @Description
 * 第一个操作   第二个操作：普通读写   第二个操作：volatile读   第二个操作：volatile写
 * 普通读写         可以重排            可以重排                不可以重排
 * volatile读    不可以重排           不可以重排                不可以重排
 * volatile写    可以重排             不可以重排                不可以重排
 */
public class Jmm06_MemoryBarrier {
    int a=0;
    int c=0;
    public volatile int m1 = 1;
    public volatile int m2 = 2;

    public void readAndWrite() {

        int c = 2; //普通写
        // int i = m1; // volatile 读，普通写
        m1 = 3;

        int i = m1;   // 第一个volatile读
        a = 4;
        int j = m2;   // 第二个volatile读

        a = i + j;    // 普通写

        m1 = i + 1;   // 第一个volatile写
        m2 = j * 2;   // 第二个 volatile写
    }

}
